import { ref } from 'vue';
import axios from 'axios';
import type { Ref } from 'vue';
import { ElLoading, ElMessage } from 'element-plus';
import {getPatInfo} from "@/api/msip/setl.ts";

// 定义地区类型枚举
export enum RegionType {
    ChongQing_DR = 'ChongQing_DR',
    JiangSuWuXi_DR = 'JiangSuWuXi_DR',
}
// 定义读卡参数入参
export interface ReadCardParams {
    mdtrt_cert_type: string; //就诊凭证类型: 01=医保电子凭证 02=居民身份证 03=社会保障卡 04=终端扫码 05=终端扫脸
    cardtype: string;//卡片类型: 0=实体卡 1=电子社保卡 mdtrt_cert_type 为“03”时必填
    businesstype: string; //用码业务类型: 01301=结算 mdtrt_cert_type 为“01”时必填
    operatorid: string; //收款员编号 mdtrt_cert_type 为“01”时必填
    operatorname: string; //收款员姓名 mdtrt_cert_type 为“01”时必填
    officeid: string;//医保科室编号 mdtrt_cert_type 为“01”时必填
    officename: string;//科室名称 mdtrt_cert_type 为“01”时必填
    org_id: string; //机构id
    his_user_id: string; //用户id
    name: string;
    idNo: string;
    dynamic_ip: string; //当前电脑ip
}

// 定义读卡接口反参
const authData = ref(); //身份读卡数据集

// 定义人员信息反参
export interface MedicalCardData {
    // 基本信息
    baseinfo: {
        psn_no: string; //人员编号
        psn_name: string;//人员姓名
        certno: string;//证件号码
        gend: string;//性别
        naty: string;//民族
        brdy: string;//出生日期
        age: number;//年龄
    };
    // 参保信息列表
    insuinfo: {
        insutype: string;//参保类型
        balc: number;//账户余额
        psn_insu_stas: number;//参保状态
        insuplc_admdvs: string;//参保地医保区划
        psn_type: string;//	人员类别
        psn_insu_date: string;//	个人参保日期
        paus_insu_date: string;//	暂停参保日期
        cvlserv_flag: string;//	公务员标志
        emp_name: string;//	单位名称
    }[];
    // 身份信息列表
    idetinfo: {
        psn_idet_type: string;//身份类型
        psn_type_lv: string;//人员类别等级
        begntime: string;//开始时间
        endtime: string;//结束时间
    }[];
    // 基本信息 重庆独有
    cardecinfo: {
        psn_cert_type: string; //人员证件类型
        certno: string;//证件号码
        psn_name: string;//人员姓名
        cardno: string;//社保卡卡号
        card_sn: string;//卡识别码
        ecToken: string;//令牌
    };
}

export default function useReadCard() {
    const ybtLoadingInstance = ref<any>(null);
    const cardData: Ref<MedicalCardData | null> = ref(null);
    const error = ref<Error | null>(null);
    const isLoading = ref(false);

    //读卡
    const idAuth = async (params: ReadCardParams,apiDictType: string,mdtrt_cert_no: Ref<string>): Promise<MedicalCardData> => {
        try {
            isLoading.value = true;
            error.value = null;

            ybtLoadingInstance.value = ElLoading.service({
                lock: true,
                text: '正在读取医保卡信息...',
                background: 'rgba(0, 0, 0, 0.7)'
            });
            debugger
            // 使用 await 等待异步请求完成
            const response = await axios.post(
                `${import.meta.env.VITE_YBT_API_BASE}/id_auth`,
                JSON.stringify(params)
            );
            if (response.data.code === 0) {
                // 根据apiDictType各地区医保差异化处理
                switch(apiDictType) {
                    case RegionType.ChongQing_DR:
                        // 重庆地区特殊处理 重庆不需要调用1101
                        cardData.value = processCardData(response.data.data);
                        if (params.mdtrt_cert_type == '01') {
                            mdtrt_cert_no.value = cardData.value.cardecinfo.ecToken;//就诊凭证编号 字符型 50 Y 就诊凭证类型为“01”时填写电子凭证令牌，为“02”时填写身份证号，为“03”时填写社会保障卡卡号
                        } else if (params.mdtrt_cert_type == '03') {
                            mdtrt_cert_no.value = cardData.value.cardecinfo.cardno;//就诊凭证编号 字符型 50 Y 就诊凭证类型为“01”时填写电子凭证令牌，为“02”时填写身份证号，为“03”时填写社会保障卡卡号
                        }
                        break;
                    case RegionType.JiangSuWuXi_DR:
                        // 江苏无锡地区处理
                        authData.value = response.data.data;
                        await nextTick();
                        if (params.mdtrt_cert_type == '01') {
                            mdtrt_cert_no.value = authData.value.cardecinfo.ecToken;//就诊凭证编号 字符型 50 Y 就诊凭证类型为“01”时填写电子凭证令牌，为“02”时填写身份证号，为“03”时填写社会保障卡卡号
                        } else if (params.mdtrt_cert_type == '03') {
                            mdtrt_cert_no.value = authData.value.cardecinfo.cardno;//就诊凭证编号 字符型 50 Y 就诊凭证类型为“01”时填写电子凭证令牌，为“02”时填写身份证号，为“03”时填写社会保障卡卡号
                        }
                        try {
                            await getInfo(params.mdtrt_cert_type, params.org_id, params.his_user_id, params.dynamic_ip);
                        } catch (err) {
                            handleError(err as Error);
                            throw err;
                        }
                        break;
                }
                //患者身份校验
                let _psn_cert_type = cardData.value.baseinfo.psn_cert_type;
                let _certno = cardData.value.baseinfo.certno;
                let _psn_name = cardData.value.baseinfo.psn_name;
                if (params.idNo && _psn_cert_type == '01' && params.idNo != _certno) {
                    return ElMessage.error('患者【' + params.name + '】与持卡人【' + _psn_name + '】身份证号不符，请核实！！！');
                }
                if (params.name != _psn_name) {
                    return ElMessage.error('患者【' + params.name + '】与持卡人【' + _psn_name + '】姓名不符，请核实！！！');
                }
                return cardData.value; // 直接返回处理后的数据
            }
            throw new Error(response.data.msg || '读卡失败');
        } catch (err: any) {
            error.value = err;
            handleError(err);
            throw err;
        } finally {
            ybtLoadingInstance.value?.close();
            isLoading.value = false;
        }
    };

    // 获取人员信息
    async function getInfo(_mdtrt_cert_type, _org_id, _his_user_id, _dynamic_ip) {
        return new Promise((resolve, reject) => {
            let _mdtrt_cert_no = '';
            let _psn_cert_type = '01';
            let _certno = '';
            let _psn_name = '';
            let _rd_insuplc_admdvs = '';
            let _card_sn = '';
            if (_mdtrt_cert_type == '01') {
                _mdtrt_cert_no = authData.value.ecinfo.ectoken;//就诊凭证编号 字符型 50 Y 就诊凭证类型为“01”时填写电子凭证令牌，为“02”时填写身份证号，为“03”时填写社会保障卡卡号
                _psn_cert_type = authData.value.ecinfo.psn_cert_type;//人员证件类型 字符型 6 Y Y 就诊凭证类型为“02”时代表身份证，其他证件类型按实际上传
                _certno = authData.value.ecinfo.idno;// 证件号码 字符型 50 Y 就诊凭证类型为 “03”时需要从1191 的输出获取
                _psn_name = authData.value.ecinfo.username;// 人员姓名 字符型 50 Y 就诊凭证类型为“01”时必填；跨省异地必填
                _rd_insuplc_admdvs = authData.value.ecinfo.insuorg;//参保地区编码
            } else if (_mdtrt_cert_type == '03') {
                _mdtrt_cert_no = authData.value.cardecinfo.cardno;//就诊凭证编号 字符型 50 Y 就诊凭证类型为“01”时填写电子凭证令牌，为“02”时填写身份证号，为“03”时填写社会保障卡卡号
                _card_sn = authData.value.cardecinfo.card_sn;//卡识别码 字符型 32 就诊凭证类型为“03”时必填
                _psn_cert_type = authData.value.cardecinfo.psn_cert_type;// 人员证件类型 字符型 6 Y Y 就诊凭证类型为“02”时代表身份证，其他证件类型按实际上传
                _certno = authData.value.cardecinfo.certno;// 证件号码 字符型 50 Y 就诊凭证类型为 “03”时需要从1191 的输出获取
                _psn_name = authData.value.cardecinfo.psn_name;// 人员姓名 字符型 50 Y 就诊凭证类型为“01”时必填；跨省异地必填
                _rd_insuplc_admdvs = authData.value.cardecinfo.insuplc_admdvs;//参保地区编码
            }
            const param = {
                mdtrt_cert_type: _mdtrt_cert_type,// 就诊凭证类型 字符型 3 Y Y
                mdtrt_cert_no: _mdtrt_cert_no,// 就诊凭证编号 字符型 50 Y 就诊凭证类型为“01”时填写电子凭证令牌，为“02”时填写身份证号，为“03”时填写社会保障卡卡号
                card_sn: _card_sn,// 卡识别码 字符型 32 就诊凭证类型为“03”时必填
                begntime: '',// 开始时间 日期时间型 获取历史参保信息时传入
                psn_cert_type: _psn_cert_type,// 人员证件类型 字符型 6 Y Y 就诊凭证类型为“02”时代表身份证，其他证件类型按实际上传
                certno: _certno,// 证件号码 字符型 50 Y 就诊凭证类型为 “03”时需要从1191 的输出获取
                psn_name: _psn_name,// 人员姓名 字符型 50 Y 就诊凭证类型为“01”时必填；跨省异地必填
                insuplc_admdvs: _rd_insuplc_admdvs,//参保地区编码
                orgId: _org_id,//机构ID
                userId: _his_user_id,//用户id
                dynamic_ip: _dynamic_ip,//当前电脑ip
            }
            getPatInfo(param).then((res: resType) => {
                if (res && res.code === 200) {
                    cardData.value = processCardData(res.data.output);
                    resolve();
                } else {
                    ElMessage.error(res?.msg || '获取人员信息失败');
                    reject(new Error(res?.msg || '获取人员信息失败'));
                }
            }).catch(err => {
                reject(err);
            });
        });
    }
    // 组织反参数据
    const processCardData = (data: any): MedicalCardData => ({
        baseinfo: {
            psn_no: data.baseinfo.psn_no,
            psn_name: data.baseinfo.psn_name,
            certno: data.baseinfo.certno,
            gend: data.baseinfo.gend,
            naty: data.baseinfo.naty,
            brdy: data.baseinfo.brdy,
            age: data.baseinfo.age
        },
        insuinfo: data.insuinfo?.map((item: any) => ({
            insutype: item.insutype,
            balc: item.balc,
            insuplc_admdvs: item.insuplc_admdvs,
            psn_insu_stas: item.psn_insu_stas,
            psn_insu_date: item.psn_insu_date,
            paus_insu_date: item.paus_insu_date,
            psn_type: item.psn_type,
            cvlserv_flag: item.cvlserv_flag,
            emp_name: item.emp_name
        })) || [],
        idetinfo: data.idetinfo?.map((item: any) => ({
            psn_idet_type: item.psn_idet_type,
            psn_type_lv: item.psn_type_lv,
            begntime: item.begntime,
            endtime: item.endtime
        })) || [],
        cardecinfo: {
            psn_cert_type: data.cardecinfo?.psn_cert_type ? data.cardecinfo.psn_cert_type : '',
            certno: data.cardecinfo?.certno ? data.cardecinfo.certno : '',
            psn_name: data.cardecinfo?.psn_name ? data.cardecinfo.psn_name : '',
            cardno: data.cardecinfo?.cardno ? data.cardecinfo.cardno : '',
            card_sn: data.cardecinfo?.card_sn ? data.cardecinfo.card_sn : '',
            ecToken: data.cardecinfo?.ecToken ? data.cardecinfo.ecToken: ''
        }
    });

    const handleError = (err: Error) => {
        console.error('读卡错误:', err);
        ElMessage.error({
            message: `读卡失败: ${err.message}`,
            duration: 3000
        });
    };

    return {
        cardData,
        error,
        isLoading,
        idAuth
    };
}
